Skip to main content

ElasticSearch 增删查改

[TOC]

ElasticSearch 增删查改

定义 mapping 类型

PUT /book
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"clike":{
"type": "integer"
},
"create_date":{
"type": "date"
}
}
}
}

获取 book 的mapping信息

GET /book2/_mapping

keyword 类型 不会被分词器解析

通过GET _cat 可以获取很多信息 GET _cat/indices

创建

POST 和 PUT 都可以

修改

  • PUT 是创建和覆盖数据

    提交的数据会把原来的数据覆盖。

  • POST 是修改数据

    提交的数据会修改原数据。 PUT 和 POST 修改数据的区别是,PUT提交的内容会替换原来所有的数据。POST提交的只修改提交的内容,其他内容不变。

查询

高亮搜索结果

GET /lib3/user/_search
{
"query": {
"match": {
"interests": "changge"
}
},
"highlight": {
"fields": {
"interests": {}
}
}
}

# 查询所有文档,不管是哪个索引下的
GET _search

# 查询lib索引下所有文档
GET /lib/_search

# 指定lib、lib3索引下的所有文档
GET /lib,lib3/_search

# *号为通配符,查询结尾是3和4的索引下的所有文档
GET /*3,*4/_search

# 可以指定类型type,(6.0以后一个_index下只能有一个_type,等价于GET /lib/_search)
GET /lib/user/_search

# 指定多个索引,多个类型,(6.0以后一个_index下只能有一个_type,等价于GET /lib,lib3/_search)
GET /lib,lib3/user,items/_search

# _all表示集群下的所有索引
GET /_all/_search

# 查询所有索引下,只查询user、items类型的文档
GET /_all/user,items/_search

返回版本号

version:当设置version为true时,查询的文档中将返回版本信息,默认情况是false(即不设置的version时)

GET /lib3/user/_search
{
"version": true,
"query": {
"terms": {
"interests": ["hejiu", "changge"]
}
}
}

term查询和terms查询

term query回去倒排索引中寻找确切的term(即精准查询),它并不知道分词器的存在。这种查询适合keyword,numeric,date。

  • term:查询某个字段里含有某个关键词的文档
GET /lib3/user/_search
{
"query": {
"term": {
"interests": "changge"
}
}
}
  • terms:查询某个字段里含有多个关键字的文档
GET /lib3/user/_search
{
"query": {
"terms": {
"interests": ["hejiu", "changge"] # 这里多个条件是或(即or)的关系
}
}
}

控制加载的字段

  • includes:包含某些字段,可以使用通配符进行查询
  • excludes:排除某些字段,可以使用通配符进行查询
GET /lib3/user/_search
{
"_source": {
"includes": ["name", "address"],
"excludes": ["age", "birthday"]
},
"query": {
"match_all": {}
}
}

使用通配符查询

GET /lib3/user/_search
{
"_source": {
"includes": ["addr*"],
"excludes": ["name", "bir*"]
},
"query": {
"match_all": {}
}
}

wildcard查询

允许使用通配符 * 和 ? 来进行查询

  • *:代表0个或者多个字符
  • ?:代表任意一个字符
GET /lib3/user/_search
{
"query": {
"wildcard": {
"name": "zhao*"
}
}
}

GET /lib3/user/_search
{
"query": {
"wildcard": {
"name": "li?i"
}
}
}

fuzzy实现模糊查询

  • value:查询的关键字
  • boost:查询的权值,默认值是1.0
  • min_similarity:设置匹配的最小相似度,默认值为0.5,对于字符串,取值为0-1(包含0和1);对于数值,取值可能大于1;对于日期类型取值为1d,1m等,1d就代表1天
  • prefix_length:指明区分词项的共同前缀长度,默认是0
  • max_expansions:查询中的词项可以扩展的数目,默认可以无限大
GET /lib3/user/_search
{
"query": {
"fuzzy": {
"interests": "changge"
}
}
}

GET /lib3/user/_search
{
"query": {
"fuzzy": {
"interests": {
"value": "chagge" # 此处changge写成了chagge,但因为模糊查询依然可以查出结果
}
}
}
}

范围查询

range:实现范围查询

==参数:from、to、include_lower、include_upper、boost==

  • include_lower:是否包含范围的左边界,默认是true
  • include_upper:是否包含范围的右边界,默认是true
GET /lib3/user/_search
{
"query": {
"range": {
"birthday": {
"from": "1990-10-10",
"to": "2018-05-01"
}
}
}
}

GET /lib3/user/_search
{
"query": {
"range": {
"age": {
"from": 20,
"to": 25,
"include_lower": true,
"include_upper": false
}
}
}
}

match查询

match query知道分词器的存在,会对filed进行分词操作,然后在查询

GET /lib3/user/_search
{
"query": {
"match": {
"name": "zhaoliu"
}
}
}

# 分词的体现
# 匹配的条件越多,相似度的值将会越高

GET /lib3/user/_search
{
"query": {
"match": {
"name": "zhaoliu zhaoming"
}
}
}

GET /lib3/user/_search
{
"query": {
"match": {
"age": 20
}
}
}
  • match_all:查询所有文档
GET /lib3/user/_search
{
"query": {
"match_all": {}
}
}
  • multi_match:可以指定多个字段
GET /lib3/user/_search
{
"query": {
"multi_match": {
"query": "lvyou",
"fields": [
"interests",
"name"
]
}
}
}

match_phrase:短语匹配查询

Elasticsearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变;

GET /lib3/user/_search
{
"query": {
"match_phrase": {
"interests": "duanlian, shuoxiangsheng"
}
}
}

排序

使用sort实现排序:

  • desc降序
  • asc升序
GET /lib3/user/_search
{
"sort": [
{
"age": {
"order": "asc"
}
}
],
"query": {
"match_all": {}
}
}

查询结果分析

  • took:查询耗费的时间,单位是毫秒
  • _shard:共请求了多少个shard
  • total:查询出的文档总个数
  • max_score:本次查询中,相关度分数的最大值,文档和此次查询的匹配度越高,_score的值越大,排位越靠前
  • hits:默认查询前10个文档
  • time_out: 查询超时时间,设置超时时间将返回已经查询出来的数据
GET  /lib3/user/_search?timeout=10ms
{
"_source": [
"address",
"name"
],
"query": {
"match": {
"interests": "changge"
}
}
}

{
"took": 419,
"time_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0.6931472,
"hits": [
{
"_index": "lib3",
"_type": "user",
"_id": "3",
"_score": 0.6931472,
"_source": {
"address": "bei jing hai dian qu qing he zhen",
"name": "lisi"
}
},
{
"_index": "lib3",
"_type": "user",
"_id": "2",
"_score": 0.47000363,
"_source": {
"address": "bei jing hai dian qu qing he zhen",
"name": "lisi"
}
}
]
}
}

分页查询 (from, size)

  • from 偏移,默认为0
  • size 返回的结果数,默认为10
curl -XGET 'localhost:9200/index/type/_search?pretty' -d '
{
"query": { "match_all": {} },
"from":1,
"size":2
}'